/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package singletons;

import com.beans.EventoBean;
import com.util.Conectar;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import javax.naming.NamingException;

/**
 *Guardará la informacion de los eventos que habrá en el mes de la fecha actual
 * y el mes siguiente. Para ajilizar la carga de la pagina de inicio que es donde
 * saldrá este calendario.
 * @author victor
 */
public class ListaEventos {
    private static HashMap lista;
    private static long tiempoVida=30*60*1000;//*60*30;
    private static long expira;
    
    
    private ListaEventos(){}
    
    public static boolean hayEvento(String fecha){
        if(refrescar()){
            cargarLista(fecha);
        }
        Object a=lista.get(fecha);
        if(a==null){
            return false;
        }else{
            //System.out.println("Lista "+lista.get(fecha).toString());
            return true;
        }
    }
    
    private static boolean refrescar() {
        if(expira<System.currentTimeMillis() || lista==null) {
            return true;
        }else {
            System.out.println("Quedan para la actualizacion (lista): "+(expira-System.currentTimeMillis())+"ms");
            return false;
        }
    }
    public static String fechaMes(String fecha){
        int anioS=Integer.parseInt(fecha.substring(6, 10));
        int mesS=Integer.parseInt(fecha.substring(3,5));
        int diaS=Integer.parseInt(fecha.substring(0, 2));
        Calendar fechaC=new GregorianCalendar(anioS,mesS-1,diaS);
        return "01-"+((fechaC.get(Calendar.MONTH)+1)<10?"0":"")+(fechaC.get(Calendar.MONTH)+1)+"-"+fechaC.get(Calendar.YEAR);
    }
    /**
     * Devuelve la fecha del ultimo dia del mes siguiente, si pasamos 22-01-1982
     * devolvera 28-02-1982
     * @param fecha
     * @return
     */
    public static String fechaMesSiguiente(String fecha){
        int anioS=Integer.parseInt(fecha.substring(6, 10));
        int mesS=Integer.parseInt(fecha.substring(3,5));
        mesS+=2;
        int diaS=Integer.parseInt(fecha.substring(0, 2));
        Calendar fechaC=new GregorianCalendar(anioS,mesS-1,0);
        
        return ""+(fechaC.get(Calendar.DAY_OF_MONTH)<10?"0":"")+fechaC.get(Calendar.DAY_OF_MONTH)+"-"+((fechaC.get(Calendar.MONTH)+1)<10?"0":"")+(fechaC.get(Calendar.MONTH)+1)+"-"+fechaC.get(Calendar.YEAR);
    }
    private static void cargarLista(String fechaInicio){
        lista=new HashMap();
      //System.out.println("Fecha1: "+fechaInicio);
        //Hay que convertir la fechas a las de los meses
        String fechaInicioMysql=com.util.Utils.fechaParaMysql(fechaMes(fechaInicio));
        String fechaFinMysql=com.util.Utils.fechaParaMysql(fechaMesSiguiente(fechaInicio));
      //System.out.println("Fecha");
        Connection conexion;
        try {

            conexion = Conectar.getConnection();

            String selectCustomerStr = "SELECT * FROM eventos where fechaEvento>? and fechaEvento<?";

            PreparedStatement selectStatement =  conexion.prepareStatement(selectCustomerStr);
            selectStatement.setString(1, fechaInicioMysql);
            selectStatement.setString(2, fechaFinMysql);
          //System.out.println("Sentencia: "+selectStatement.toString());
            ResultSet rs = selectStatement.executeQuery();
         //System.out.println("se ha ejecutado la consulta");
            EventoBean evento;
            //lista=new ArrayList();
            while (rs.next()){
                evento=new EventoBean();
                evento.setIdEvento(rs.getString(1));
                evento.setFecheEvento(com.util.Utils.fecha(rs.getString(2)));
                evento.setHoraEvento(rs.getString(3));
                evento.setDescripcion(rs.getString(4));
                evento.setIdArea(rs.getString(5));
                evento.setAutor(rs.getString(6));
                 evento.setLugar(rs.getString(7));
                if(lista.get(evento.getFecheEvento())==null){
                    lista.put(evento.getFecheEvento(), new ArrayList());
                }
                ((ArrayList)lista.get(evento.getFecheEvento())).add(evento);
               // lista.
            }
            rs.close();
            conexion.close();
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } 
        expira=System.currentTimeMillis()+tiempoVida;
    }
    /**
     * Le pasamos una fecha en formato dd-mm-aaaa y nos devuelve la lista de
     * eventos de ese día.
     * @param fecha Fecha para la que queremos la lista de eventos
     * @return Un arrayList de EventoBean, si para la fecha no hay eventos devuelve
     * null.
     */
    public static ArrayList getEventosDia(String fecha){
        if(refrescar()){
            cargarLista(fecha);
        }
        Object o=lista.get(fecha);
        return (ArrayList) o;
    }
}
